iT邦幫忙

2024 iThome 鐵人賽

DAY 23
0
Python

從0開始學習Python-為未來學習AI奠定基礎系列 第 23

從0開始學習Python---進階網路爬蟲、爬取自己的鐵人檔案和Youtube

  • 分享至 

  • xImage
  •  

進階網路爬蟲

  • 處理網頁伺服器的阻擋
    網頁伺服器有時會根據請求的來源來決定是否允許訪問。如果伺服器發現我們是使用程式(如 Python 爬蟲)來訪問,可能會拒絕請求。為了避免這種情況,我們可以讓爬蟲偽裝成瀏覽器來繞過這些檢查。
    技巧:使用 User-Agent 偽裝成瀏覽器。

  • 解析動態加載的內容
    有些網頁的內容是透過 JavaScript 動態加載的,這樣的網頁用普通的爬蟲技術是無法直接取得內容的。
    技巧:使用 Selenium 模組來模擬瀏覽器操作。

  • 儲存下載的網頁
    有時候我們需要將爬取的網頁數據儲存到檔案中,方便後續分析或記錄。
    技巧:使用 with open 將網頁內容寫入自己的電腦。


應用

偽裝成瀏覽器——爬取鐵人檔案頁面

  • 偽裝成瀏覽器來進行網路爬蟲的做法,主要是通過在 HTTP 請求中加入自訂的 headers,模仿正常使用者使用瀏覽器瀏覽網頁的行為,避免伺服器阻擋爬蟲程式。
  • 網站伺服器通常會檢查 User-Agent 這個標頭來判斷訪問者是否為瀏覽器。爬蟲程式如果不帶有適當的 User-Agent,有些網站可能會拒絕請求或返回不同的內容。因此,爬蟲程式可以通過模擬 User-Agent 來偽裝成來自瀏覽器的請求。

程式碼總覽

https://ithelp.ithome.com.tw/upload/images/20240923/20168994ED8mEEn44O.png


解題分析

  1. 透過更改 headers (藍框處),程式會向我的鐵人檔案的頁面 https://ithelp.ithome.com.tw/users/20168994/ironman/7537?page=3 發送一個偽裝成瀏覽器的請求,並將網頁的標題打印出來。

要找適合的 User-Agent,可以參考瀏覽器本身的請求標頭或使用線上資源來模仿真實的瀏覽器。例如 https://www.whatismybrowser.com/ 有提供各種瀏覽器的 User-Agent。這裡就不多做贅述>"<

  1. 如果網站伺服器依賴 User-Agent 來辨別爬蟲,我們的請求看起來會像是來自於普通瀏覽器,避免被網站阻擋。可以看到最後成功輸出了我的鐵人賽檔案頁面的標題。

https://ithelp.ithome.com.tw/upload/images/20240923/20168994Hkyqklak4G.png

  1. 假如我沒有偽裝成瀏覽器,而是直接對鐵人檔案頁面進行爬蟲,會出現 403 Forbidden 錯誤。

https://ithelp.ithome.com.tw/upload/images/20240923/20168994fHs6keClkK.png
https://ithelp.ithome.com.tw/upload/images/20240923/20168994oxll48iGWE.png

403 Forbidden 代表服務器已經理解請求,但是拒絕執行它。


解析動態加載的內容——爬取Youtube

  • 使用 Selenium 模組來模擬瀏覽器操作,讓我們能夠抓取這類動態加載的內容。而Selenium 模組也是需要在終端機進行安裝的,直接執行 pip install selenium 即可。
  • webdriver 是 Selenium 中的核心功能,用來自動控制瀏覽器。可以透過這個功能來開啟瀏覽器並進行互動操作,如打開網頁、點擊按鈕、輸入文字等。

程式碼總覽

https://ithelp.ithome.com.tw/upload/images/20240923/20168994suOXLi2zQB.png


解題分析

  1. driver = webdriver.Chrome()
    使用 Selenium 建立一個 Chrome 瀏覽器的 driver。Selenium 支援多個瀏覽器(如 Firefox、Safari、Edge),但這裡我們選擇使用 Chrome 瀏覽器。

  2. driver.get('https://www.youtube.com/')
    讓瀏覽器開啟 https://www.youtube.com/ 網站,並呈現網站內容,和在手動操作時輸入網址後按下 Enter 一樣。
    https://ithelp.ithome.com.tw/upload/images/20240923/20168994rjIvjL6yuB.png

  3. driver.implicitly_wait(10)
    設定一個隱式等待(Implicit Wait)的時間。這裡的 10 表示瀏覽器會等最多 10 秒,讓所有元素、內容、JavaScript 代碼都能完成加載。特別是 YouTube 這種大型網站, JavaScript 加載需要一些時間。

隱式等待:讓程式在等待過程中不會立即拋出錯誤,而是會嘗試在 10 秒內重複檢查頁面是否已完全加載。與顯式等待不同,隱式等待可以等待網頁內的所有元素加載完成。

  1. content = driver.page_source
    從瀏覽器中取得網頁的完整 HTML 原始碼,包括動態加載的部分,並且在下一行打印出來。這是 Selenium 厲害的地方,它可以抓取使用 JavaScript 動態生成的內容,這在單純的 HTTP 請求中是無法做到的。
    https://ithelp.ithome.com.tw/upload/images/20240923/20168994i6PvsvYuZG.png

  2. driver.quit()
    關閉瀏覽器並結束 WebDriver 的會話。這是非常重要的一步,因為如果不關閉瀏覽器,程式可能會繼續佔用資源,導致電腦變慢。


儲存下載的網頁

程式碼總覽

https://ithelp.ithome.com.tw/upload/images/20240923/2016899441Q3oV4ZN3.png


解題分析

  1. with open('downloaded_page.html', 'w', encoding='utf-8') as f:
    使用 Python 的內建函數 open() 來打開一個名為 downloaded_page.html 的檔案。 'w' 代表開啟這個檔案以寫入模式,如果檔案不存在則會自動創建。
    encoding='utf-8' 指定了 UTF-8 編碼,這是為了正確處理網頁中的字元,特別是非英文的字元(如中文)。

  2. f.write(response.text)
    將伺服器回應中的 HTML 內容(即 response.text)寫入剛剛打開的 downloaded_page.html 檔案中,這樣網頁內容就會被儲存在自己的電腦裡。

  3. 檢查狀態碼:
    可以檢查網頁請求是否成功,狀態碼為 200 代表成功,其他狀態碼表示失敗或頁面不存在。
    確認狀態碼為200後,可以到執行Python腳本的目錄中,找到downloaded_page.html 檔案,點擊後會直接打開我們下載的網頁。

https://ithelp.ithome.com.tw/upload/images/20240923/201689944NdyN9Mobm.png


結語

今天學習了如何使用 User-Agent 偽裝成瀏覽器、使用 Selenium 模組來模擬瀏覽器操作,和使用 with open 將網頁內容寫入自己的電腦。透過學習爬蟲,我了解了網頁的結構,知道如何使用 Python 來與網頁互動。在這過程中我遇到不少挑戰,比如有些網站的結構會不斷改變等,導致我原本的程式碼無法正常運行 Q_Q

也讓我意識到,學習爬蟲不僅僅是寫出一段程式碼,更是要學會如何快速適應變化和解決問題。此外,有時候還需要處理網站的防爬蟲機制,不能隨意的存取網頁,這讓我更明白網頁的使用守則有多麼重要><


上一篇
從0開始學習Python---基礎網路爬蟲
下一篇
從0開始學習Python---Numpy 模組
系列文
從0開始學習Python-為未來學習AI奠定基礎27
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言